;*********************************************************** ; ; PIC入出力ポート誤動作テストプログラム(2-1) ; NOP 命令を挿入した場合 ; 信号レベル H→L の動作チェック ; ;*********************************************************** LIST P=PIC16F877 ; プロセッサの種別指定 INCLUDE "P16F877.INC" ; インクルードファイルの指定 ;*********************************************************** ; 変数定義とレジスタ割付 ;*********************************************************** COUNT EQU 20H ; ループカウンタ COUNT1 EQU 21H ; ループカウンタ COUNT2 EQU 22H ; ループカウンタ COUNT3 EQU 23H ; ループカウンタ COUNT4 EQU 24H ; ループカウンタ ORG 0 ; プログラムの開始番地の指定 ;*********************************************************** ; 入出力ピン初期化 ;*********************************************************** BSF STATUS,RP0 ; Bank 1 へ切替 CLRF TRISB ; PortB を設定(全ピン出力) BCF STATUS,RP0 ; Bank 0 へ戻す ;*********************************************************** ; メインプログラム ;*********************************************************** MAIN MOVLW 0FFH ; 全ピンHレベルに設定 MOVWF PORTB ; ポートBへ出力 CALL TIME1S ; 1秒間のウェイト BCF PORTB,7 ; RB7ピンをLレベルに設定 NOP ; 誤動作防止のNOP命令 BCF PORTB,6 ; RB6ピンをLレベルに設定 NOP ; 誤動作防止のNOP命令 BCF PORTB,5 ; RB5ピンをLレベルに設定 NOP ; 誤動作防止のNOP命令 BCF PORTB,4 ; RB4ピンをLレベルに設定 NOP ; 誤動作防止のNOP命令 BCF PORTB,3 ; RB3ピンをLレベルに設定 NOP ; 誤動作防止のNOP命令 BCF PORTB,2 ; RB2ピンをLレベルに設定 NOP ; 誤動作防止のNOP命令 BCF PORTB,1 ; RB1ピンをLレベルに設定 NOP ; 誤動作防止のNOP命令 BCF PORTB,0 ; RB0ピンをLレベルに設定 NOP ; 誤動作防止のNOP命令 CALL TIME1S ; 1秒間のウェイト CALL TIME1S ; 1秒間のウェイト CALL TIME1S ; 1秒間のウェイト GOTO MAIN ; 繰り返し(MAINラベルへ戻る) ;*********************************************************** ;遅延サブルーチン ;*********************************************************** ;100μs遅延サブルーチン(20MHzクロック時) TIME100 MOVLW 0A5H ; 1サイクル A5H=165 MOVWF COUNT ; 1サイクル NOP ; 1サイクル 微調整ダミー NOP ; 1サイクル 微調整ダミー LOOP DECFSZ COUNT,F ; 1×(165-1)+2 = 166サイクル GOTO LOOP ; 2×(165-1) = 328サイクル RETURN ; 2サイクル ;10ms遅延サブルーチン(20MHzクロック時) TIME10M MOVLW 63H ; 1サイクル 63H=99 MOVWF COUNT1 ; 1サイクル NOP ; 1サイクル 微調整ダミー NOP ; 1サイクル 微調整ダミー LOOP1 CALL TIME100 ; (2+500)×99=49698サイクル DECFSZ COUNT1,F ; 1×(99-1)+2 = 100サイクル GOTO LOOP1 ; 2×(99-1) = 196サイクル RETURN ; 2サイクル ;1s遅延サブルーチン(20MHzクロック時) TIME1S MOVLW 63H ; 1サイクル 63H=99 MOVWF COUNT2 ; 1サイクル MOVLW 62H ; 1サイクル 62H=98 MOVWF COUNT3 ; 1サイクル MOVLW 03H ; 1サイクル 03H=3 MOVWF COUNT4 ; 1サイクル NOP ; 1サイクル 微調整ダミー LOOP2 CALL TIME10M ;(2+50000)×99=4950198サイクル DECFSZ COUNT2,F ; 1×(99-1)+2 = 100サイクル GOTO LOOP2 ; 2×(99-1) = 196サイクル LOOP3 CALL TIME100 ;(2+500)×98=49196 DECFSZ COUNT3,F ; 1×(98-1)+2 = 99サイクル GOTO LOOP3 ; 2×(98-1) = 194サイクル LOOP4 DECFSZ COUNT4,F ; 1×(3-1)+2 = 4サイクル GOTO LOOP4 ; 2×(3-1) = 4サイクル RETURN ; 2サイクル END